Java Technologies Module এ Binding কনফিগার করা গাইড ও নোট

287

Guice-এর Module একটি কাস্টম ক্লাস যা ডিপেনডেন্সি ইনজেকশন কনফিগার করতে ব্যবহৃত হয়। Guice-এ Binding এর মাধ্যমে নির্দিষ্ট ইন্টারফেস বা ক্লাসের জন্য নির্দিষ্ট ইমপ্লিমেন্টেশন মজুদ করা হয়। একে configure() মেথডের মাধ্যমে কনফিগার করা হয়, যেখানে আপনি বিভিন্ন সার্ভিস বা ডিপেনডেন্সির জন্য Binding নির্দেশ করেন।

নিচে Guice Module এ Binding কনফিগার করার কিছু উদাহরণ দেওয়া হলো:


Binding কনফিগার করার মূল ধারণা

1. Basic Binding:

এটি সর্বাধিক সাধারণ Binding, যেখানে আপনি একটি ইন্টারফেস বা ক্লাসকে তার ইমপ্লিমেন্টেশন কনফিগার করেন।

import com.google.inject.AbstractModule;

// Service ইন্টারফেস এবং তার ইমপ্লিমেন্টেশন
public interface Service {
    void serve();
}

public class ServiceImpl implements Service {
    @Override
    public void serve() {
        System.out.println("Service is being served!");
    }
}

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        // Service ইন্টারফেসকে ServiceImpl ইমপ্লিমেন্টেশন দিয়ে bind করা
        bind(Service.class).to(ServiceImpl.class);
    }
}

2. Constructor Injection সহ Binding:

Guice Constructor Injection সাপোর্ট করে, যা অটোমেটিকভাবে নির্দিষ্ট ডিপেনডেন্সি ইনজেক্ট করে।

import com.google.inject.Inject;

// Client ক্লাস যেখানে Service ইনজেক্ট করা হবে
public class Client {
    private final Service service;

    @Inject
    public Client(Service service) {
        this.service = service;
    }

    public void doWork() {
        service.serve();
    }
}

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        // Service ইন্টারফেসকে ServiceImpl ইমপ্লিমেন্টেশন দিয়ে bind করা
        bind(Service.class).to(ServiceImpl.class);
    }
}
import com.google.inject.Guice;
import com.google.inject.Injector;

public class Main {
    public static void main(String[] args) {
        // Guice Injector তৈরি
        Injector injector = Guice.createInjector(new AppModule());

        // Client ইনস্ট্যান্স তৈরি এবং তার ডিপেনডেন্সি ইনজেক্ট করা
        Client client = injector.getInstance(Client.class);
        client.doWork(); // Output: Service is being served!
    }
}

3. Named Binding:

Guice এ আপনি @Named অ্যানোটেশন ব্যবহার করে একই টাইপের একাধিক ডিপেনডেন্সি ইনজেক্ট করতে পারেন।

import com.google.inject.name.Named;
import com.google.inject.Inject;

public class ServiceA implements Service {
    @Override
    public void serve() {
        System.out.println("Service A is being served!");
    }
}

public class ServiceB implements Service {
    @Override
    public void serve() {
        System.out.println("Service B is being served!");
    }
}

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        // Named Binding কনফিগার করা
        bind(Service.class).annotatedWith(Names.named("A")).to(ServiceA.class);
        bind(Service.class).annotatedWith(Names.named("B")).to(ServiceB.class);
    }
}
public class Client {
    private final Service serviceA;
    private final Service serviceB;

    @Inject
    public Client(@Named("A") Service serviceA, @Named("B") Service serviceB) {
        this.serviceA = serviceA;
        this.serviceB = serviceB;
    }

    public void doWork() {
        serviceA.serve(); // Output: Service A is being served!
        serviceB.serve(); // Output: Service B is being served!
    }
}

public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new AppModule());
        Client client = injector.getInstance(Client.class);
        client.doWork();
    }
}

4. Provider Binding:

Guice-এ Provider ব্যবহার করে নির্দিষ্ট ডিপেনডেন্সি তৈরি করা সম্ভব। এটি সুবিধাজনক যখন ডিপেনডেন্সি জেনেরেটর ফাংশন তৈরি করতে চান।

import com.google.inject.Provider;

public class ServiceProvider implements Provider<Service> {
    @Override
    public Service get() {
        return new ServiceImpl();
    }
}

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        // Service ইন্টারফেসের জন্য Provider Binding
        bind(Service.class).toProvider(ServiceProvider.class);
    }
}
public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new AppModule());

        // Service ইন্টারফেসের ইনস্ট্যান্স তৈরি করা হচ্ছে ServiceProvider থেকে
        Service service = injector.getInstance(Service.class);
        service.serve(); // Output: Service is being served!
    }
}

5. Scoped Binding:

Guice-এ সোকোপ (scope) ব্যবহার করা যেতে পারে, যেমন @Singleton অ্যানোটেশন দিয়ে সিঙ্গেলটন ইনস্ট্যান্স তৈরি করা।

import com.google.inject.Singleton;

@Singleton
public class SingletonService implements Service {
    @Override
    public void serve() {
        System.out.println("Singleton Service is being served!");
    }
}

public class AppModule extends AbstractModule {
    @Override
    protected void configure() {
        bind(Service.class).to(SingletonService.class);
    }
}
public class Main {
    public static void main(String[] args) {
        Injector injector = Guice.createInjector(new AppModule());

        // একই ইনস্ট্যান্স পুনরায় ব্যবহার করা হচ্ছে (সিঙ্গেলটন)
        Service service1 = injector.getInstance(Service.class);
        Service service2 = injector.getInstance(Service.class);

        System.out.println(service1 == service2); // Output: true
    }
}

Guice-এ Module ব্যবহার করে Binding কনফিগার করা একটি শক্তিশালী উপায় যা ডিপেনডেন্সি ইনজেকশন সহজ করে এবং অ্যাপ্লিকেশনের কোড আরো মডুলার এবং রিইউজেবল করে তোলে। Guice এর মাধ্যমে আপনি বিভিন্ন ধরনের Binding কনফিগার করতে পারেন যেমন:

  • Basic Binding
  • Constructor Injection
  • Named Binding
  • Provider Binding
  • Scoped Binding

এগুলি প্রজেক্টের প্যাটার্ন অনুযায়ী ব্যবহার করে আপনি আপনার অ্যাপ্লিকেশন আরও কার্যকরী এবং maintainable করতে পারবেন।

Content added By
Promotion

Are you sure to start over?

Loading...